package com.ssau.expert.app;

import com.ssau.expert.common.QuestionRequestListener;
import com.ssau.expert.common.SuggestedResult;
import com.ssau.expert.exception.NotInitializedException;
import com.ssau.expert.exception.RuleParseException;
import com.ssau.expert.exception.SemanticException;

import java.io.File;
import java.io.IOException;
import java.util.List;

/**
 * Author: Sergey Saiyan
 * Created: 04.09.13 22:21
 */
public interface ExpertAPI {

    /**
     * Добавляет слушателя на событие запроса инициализации переменной.
     * Необходимо на GUI уровне подписаться на событие запроса.
     *
     * @param listener Слушатель события
     */
    void setQuestionRequestListener(QuestionRequestListener listener);

    /**
     * Этот метод надо вызвать до того, как начнется работа
     * непосредственно с экспертом.
     * <p/>
     * Все исключения обрабатываемые, т.е. на GUI их надо ловить, и выводить
     * предупреждение на экран. Детали ошибки можно получить  так:
     * <p/>
     * catch (RuleParseException rpEx) {
     * showWarning(rpEx.getMessage());
     * }
     *
     * @param file Файл(ожидается txt) с правилами
     * @throws IOException        Обычное IO исключение, кидается, если файл недоступен
     * @throws RuleParseException Исключение кидается, если у правила кривая конструкция
     * @throws SemanticException  Кидается например, если переменной в правиле сначала присваивается int, а потом string
     */
    void uploadFileWithRules(File file) throws IOException, RuleParseException, SemanticException;

    /**
     * Маркерный метод. Необходимо вызвать прямо перед консультацией.
     * Нужен только для проверки, что все готово.
     *
     * @throws NotInitializedException - Проверяемое исключение, требует try-catch
     */
    void initExpertSystem() throws NotInitializedException;

    /**
     * Возвращает результат консультации
     * Вызывать, когда hasMoreQuestions вернет FALSE
     * <p/>
     * Возможен NULL
     *
     * @return SuggestedResult
     */
    SuggestedResult getResult();

    /**
     * Дает доступ к БД, т.е. можно получить все списки нашей предметной области
     */
    DatabaseAPI getDatabase();

    /**
     * Лог работы
     */
    List<String> getLog();

    String getShipProfileAnswer();

    String getStaffAnswer();

    String getDistanceAnswer();


}
